//
// Created by Jisam on 2024/7/1.
//
#include <bits/stdc++.h>
// 定义一个长整型别名，用于处理大数情况
#define i64 long long

// 使用标准库命名空间，方便调用各种标准函数和容器
using namespace std;

// 定义常量MAXN，用于限制字符串数组的最大长度
const int MAXN = 20 + 5;

// 定义全局变量，用于存储中间计算结果和输入数据
int n, maxLen;
string words[MAXN], str;
int used[MAXN];

/**
 * 计算两个字符串s1和s2的最长公共后缀长度
 * @param s1 第一个字符串
 * @param s2 第二个字符串
 * @return 返回最长公共后缀的长度
 */
int calc(string s1, string s2) {
    // 从后向前遍历s1，寻找与s2匹配的最长后缀
    for (int i = s1.size(); i >= 0; i--) {
        if (s1[i] == s2[0]) {
            int l = i;
            // 遍历s2，检查是否为s1的后缀
            for (int j = 0; j < s2.length(); j++) {
                if (s1[l] == s2[j]) {
                    l++;
                } else {
                    // 不匹配时退出循环
                    break;
                }
            }
            // 如果l等于s1的长度，说明s2是s1的后缀
            if (l == s1.size()) {
                return l - i;
            }
        }
    }
    // 未找到匹配后缀，返回0
    return 0;
}

/**
 * 深度优先搜索函数，用于寻找最长的特殊字符串
 * @param sumSameLen 当前已累计的相同后缀长度
 * @param x 当前构建的特殊字符串
 */
void dfs(int sumSameLen, string x) {
    // 更新最长特殊字符串的长度
    maxLen = max(maxLen, (int)x.size() - sumSameLen);
    // 遍历所有可能的单词
    for (int i = 1; i <= n; i++) {
        int sameLen = 0;
        // 如果当前单词已使用两次，则跳过
        if (used[i] >= 2) {
            continue;
        }
        // 计算当前单词与x的最长公共后缀长度
        sameLen = calc(x, words[i]);
        // 如果没有公共后缀，跳过
        if (!sameLen) {
            continue;
        }
        // 标记当前单词为已使用
        used[i]++;
        // 递归调用，尝试将当前单词添加到特殊字符串中
        dfs(sumSameLen + sameLen, x + words[i]);
        // 回溯，撤销当前单词的使用标记
        used[i]--;
    }
    return;
}

int main() {
    // 关闭同步标准输入输出与C风格输入输出，提高性能
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // 输入单词数量和各个单词
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> words[i];
    }
    // 输入特殊字符串
    cin >> str;

    // 调用深度优先搜索函数，开始寻找最长特殊字符串
    dfs(0, str);

    // 输出结果
    cout << maxLen;

    return 0;
}
